<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>全局作用域scope</title>
</head>
<body>
<script>
    /*作用域指一个变量的作用范围
    *   分类:
    *       1.全局作用域
    *               直接编写在script标签中的JS代码,都在全局作用域里 在页面打开时创建，页面关闭时销毁
    *               全局作用域里有一个对象window  它是浏览器的窗口 由浏览器创建，可以直接使用
    *               在全局作用域里
    *                       创建的变量,都会做为window对象的属性保存
    *                       创建的函数，都会作为window对象的方法保存
    *           a.变量声明提前 使用var关键字声明的变量，会在所有代码执行之前被声明（不会赋值）
    *              不使用var关键字则变量不会被声明提前
    *           b.函数的声明提前 使用函数声明形式创建的函数function 函数名(){} 它会在所有代码执行之前被创建，
    *                           所以我们可以在函数声明之前调用
    *               使用函数表达式创建的函数 不会被提前声明 所以不能在声明提前调用
    *               全局作用域的变量都是全局变量 在页面的任意部分都可以访问到
    *       2.函数作用域（局部作用域）
    *             调用函数创建的作用域,函数执行时创建，函数执行完毕后销毁
    *              每调用一次函数 就会有创建新的作用域,它们是互相独立的
    *               函数作用域的变量可以访问全局作用域的变量
    *               在全局作用域里无法访问函数作用域的变量
    *               在函数作用域中操作一个变量时，先在本身找 如果没有 则向上一级找 如果还没有 会一直寻找下去，直到找到全局作用
    *                   如果全局作用域里还没有 则报错
    *               在函数中想访问全局的 使用window.
    *               在函数中 没用var声明的变量都会成为全局变量
    * */
    console.log(window);

    console.log(a);//返回undefined
    var a=123;
    fun();
    // fun2();//放在这里 会报错
    function fun() {
        console.log("我是fun函数");//使用声明创建的函数
    }
    var fun2=function () {
        console.log("我是fun2函数")//表达式创建的函数
    };
    fun2();
    var b=852;
    function fun1() {
        var c=3;
        console.log("b="+b);
    }
    fun1();
    // console.log("c="+c); //报错

    var e=15;
    function fun3() {
        console.log("e="+e);
        e=20;//在函数中 没用var声明的变量都会成为全局变量
    }
    fun3();
    console.log("e="+e)
</script>
</body>
</html>